#ifndef __RSA_CRYPT_H
#define __RSA_CRYPT_H

#include <openssl/rsa.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/md5.h>

#define CIPHERTEXT_LEN(x) RSA_size(x)

/*生成rsa密钥对
* 成功返回RSA结构，否则返回NULL
*/
RSA *rsa_generate_key(void);
/*存储公钥到文件
* r:对应的RSA结构
* filename:文件名
* 成功返回1，否则返回0或-1
*/
int rsa_save_public_to_file(RSA *r,const char *filename);
/*从文件读取公钥
* filename:文件名
* 成功返回RSA结构，否则返回NULL
*/
RSA *rsa_get_public_from_file(const char *filename);
/*存储私钥到文件
* r:对应的RSA结构
* filename:文件名
* u:密码，不需要则传入NULL
* 成功返回1，否则返回0或-1
*/
int rsa_save_private_to_file(RSA *r,const char *filename,void *u);
/*从文件读取私钥，若设置了密码，需要传入密码u否则为NULL
* filename:文件名
* u:密码，未设置则传入NULL
* 成功返回RSA结构，否则返回NULL
*/
RSA * rsa_get_private_from_file(const char *filename,void *u);
/*从内存读取公钥
* buf:存放公钥的内存
* len:buf长度
* 成功返回RSA结构，否则返回NULL
*/
RSA * rsa_get_public_from_mem(const void *buf,int len);
/*从内存读取私钥
* buf:存放私钥的内存
* len:buf长度
* u:密码，未设置则传入NULL
* 成功返回RSA结构，否则返回NULL
*/
RSA * rsa_get_private_from_mem(const void *buf,int len,void *u);
/*rsa 公钥加密
* plaintext:明文
* palintext_len:明文长度
* r:对应的RSA结构
* ciphertext:密文（密文指向的内存大小应大于等于CIPHERTEXT_LEN(x)）
* 成功返回密文长度，否则返回-1
*/
int rsa_public_encrypt(const unsigned char *plaintext,int palintext_len,RSA *r,unsigned char *ciphertext);
/*rsa 私钥解密
* ciphertext:密文
* r:对应的RSA结构
* plaintext:明文
* 成功返回明文长度，否则返回-1
*/
int rsa_private_decrypt(const unsigned char *ciphertext,RSA *r,unsigned char *plaintext);
/*rsa 私钥加密
* plaintext:明文
* palintext_len:明文长度
* r:对应的RSA结构
* ciphertext:密文（密文指向的内存大小应大于等于CIPHERTEXT_LEN(x)）
* 成功返回密文长度，否则返回-1
*/
int rsa_private_encrypt(const unsigned char *plaintext,int palintext_len,RSA *r,unsigned char *ciphertext);
/*rsa 公钥解密
* ciphertext:密文
* r:对应的RSA结构
* plaintext:明文
* 成功返回明文长度，否则返回-1
*/
int rsa_public_decrypt(const unsigned char *ciphertext,RSA *r,unsigned char *plaintext);
/*rsa 签名
* r:对应的RSA结构
* d:数据
* n:数据长度
* sigret:签名（签名指向的内存大小应大于等于CIPHERTEXT_LEN(x)）
* siglen:签名长度
* 成功返回1，否则返回0
*/
int rsa_sign(RSA *r,const unsigned char *d,size_t n,unsigned char *sigret,unsigned int *siglen);
/*rsa 验签
* r:对应的RSA结构
* d:数据
* n:数据长度
* sigret:签名
* siglen:签名长度
* 成功返回1，否则返回0
*/
int rsa_verify(RSA *r,const unsigned char *d,size_t n,unsigned char *sigret,unsigned int siglen);

#endif/*__RSA_CRYPT_H*/
